package com.spzx.order;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.spzx.common.core.web.controller.BaseController;
import com.spzx.common.core.web.domain.BaseEntity;

/**
 * MyBatis-Plus 代码自动生成器
 * 运行此 Main 方法后，会根据数据库表结构自动生成 Entity、Mapper、Service、Controller 层代码
 * @author GAX
 * @date 2025-08-23
 */
public class AutoGenMP {
    public static void main(String[] args) {
        // 1. 创建生成器对象，并配置数据库连接
        FastAutoGenerator.create("jdbc:mysql://192.168.12.130:3306/spzx-order?characterEncoding=utf-8&useSSL=false",
                        "root",
                        "191151084")

                // 2. 全局配置
                .globalConfig(builder -> builder
                        .author("gax") // 生成的文件注释中标注的作者名
                        .outputDir("D:/spzx_mp_autogen/order") // 生成的代码位置，代码会输出到此目录下
                        .dateType(DateType.ONLY_DATE) // 数据库中日期类型（Date/TimeStamp）对应实体类中的类型，ONLY_DATE 表示只用 java.util.Date
                        .disableOpenDir() // 生成完成后不自动打开输出目录
                )
                // 3. 包配置：指定生成的代码所在的包结构
                .packageConfig(builder -> builder
                        .parent("com.spzx.order") // 父包名，所有生成的代码都会在这个包下
                        .entity("domain") // Entity 实体类所在的包名 -> com.spzx.product.domain
                        .mapper("mapper") // Mapper接口所在的包名 -> com.spzx.product.mapper
                        .xml("mapper.order") // Mapper对应的XML文件所在的包名 -> com.spzx.product.mapper.product
                        .service("service") // Service接口所在的包名 -> com.spzx.product.service
                        .serviceImpl("service.impl") // Service实现类所在的包名 -> com.spzx.product.service.impl
                        .controller("controller") // Controller控制器所在的包名 -> com.spzx.product.controller
                )
                // 4. 策略配置：最核心的部分，定义生成规则和表匹配
                .strategyConfig(builder -> builder
                        // 4.1 设置需要生成代码的表名（白名单）
                        .addInclude("order_info", "order_item", "order_log")

                        // 4.2 实体类(Entity)生成策略
                        .entityBuilder()
                        .enableLombok() // 使用 Lombok 注解（如@Data），省略getter/setter等方法
                        .superClass(BaseEntity.class) // 设置实体类的共同父类，继承BaseEntity
                        .addSuperEntityColumns( // 指定父类中已存在的字段，生成实体类时会自动忽略这些字段
                                "id",
                                "create_by",
                                "create_time",
                                "update_by",
                                "update_time",
                                "remark",
                                "del_flag")
                        //.addIgnoreColumns("column1", "column2") // 可选：忽略表中的特定字段，不生成到实体类中
                        .enableFileOverride() // 覆盖已有文件（谨慎使用，否则会覆盖你的自定义修改）

                        // 4.3 服务(Service)生成策略
                        .serviceBuilder()
                        //.formatServiceFileName("I%sService") // 可选：自定义Service接口文件名格式，默认是IXXXService
                        .enableFileOverride() // 覆盖已有文件

                        // 4.4 控制器(Controller)生成策略
                        .controllerBuilder()
                        .superClass(BaseController.class) // 设置Controller的共同父类
                        .enableRestStyle() // 生成REST风格的控制器（使用@RestController, @GetMapping等注解）
                        .enableFileOverride() // 覆盖已有文件
                )
                // 5. 指定模板引擎（Freemarker）
                .templateEngine(new FreemarkerTemplateEngine())
                // 6. 执行生成操作
                .execute();
    }
}